package org.shiwen.week11;


public class Outer {
    private static String farmName = "红牛牧场";
    private Inner inner;
    public void show(){
        System.out.println(farmName);
        //你无法从外部类直接调用内部类的值，要用对象调用属性/方法，在这里你是直接调用属性，所以不行
        //System.out.println(name);
        //在这里，编译没有问题，但是无法运行，因为inner这个对象是空指针，你还没有给inner赋值一个对象
        //System.out.println(inner.name);
        //这里，new了一个对象，让这个新创建的对象去调用name
        System.out.println(new Inner().name);
    }

    public void show2(){
        //或者，在创建对象的时候，先赋值对象，再做调用
        //总的来说，外部类要访问内部类的成员，必须要创建对象
        setInner(new Inner("小牛",3));

        System.out.println(inner.name);
    }

    public void setInner(Inner inner) {
        this.inner = inner;
    }

    class Inner{
        private String name;
        private int age;

        public Inner(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public Inner() {
        }

        public void showInfo(){
            System.out.println(farmName);
            System.out.println(name);
            System.out.println(age);
        }
    }
}

class TestOuter{
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.show();
        outer.show2();

        //因为内部类的对象，脱离了外部类毫无意义，所以如果你需要单独创建一个内部类的对象，你必须要让他和一个外部类对象有联系
        Outer.Inner inner = outer.new Inner("牛",5);
        inner.showInfo();
        //单独的内部类对象毫无意义，所以无法通过编译
//        Inner inner = new Inner();
    }
}